﻿Imports WSEntidades
Imports Utilerias
Imports WSDatos
Imports System.Transactions

Public Class ClientesBL
    Private Enum Accion
        Registrar
        Actualizar
    End Enum

    Public Function RegistrarCliente(ByVal TokenConexion As String, ByVal Cliente As ClientesBE, ByVal ClienteCom As ClientesComBE, ByVal ClienteAdic As ClientesAdicBE,
                                     ByRef detResp As DetalleRespuesta) As Boolean
        Dim CliDAL As ClientesDAL = New ClientesDAL("")
        Dim CliComDAL As ClientesComDAL = New ClientesComDAL("")
        Dim CliAdicDAL As ClientesAdicDAL = New ClientesAdicDAL("")
        Dim idClienteRegistrado As Integer = 0
        Dim boolTransaccComplete As Boolean = False
        detResp.Mensajes = ""
        Try
            If (EsValidoPara(Accion.Registrar, Cliente, ClienteCom, ClienteAdic, detResp.Mensajes, TokenConexion)) Then
                CliDAL = New ClientesDAL(RijndaelSimple.desencriptaDefault(TokenConexion))
                CliComDAL = New ClientesComDAL(RijndaelSimple.desencriptaDefault(TokenConexion))
                CliAdicDAL = New ClientesAdicDAL(RijndaelSimple.desencriptaDefault(TokenConexion))
                Using transacCliente As TransactionScope = New TransactionScope()
                    idClienteRegistrado = CliDAL.registraCliente(Cliente)
                    If (idClienteRegistrado > 0) Then
                        'Registrar Datos comerciales
                        Cliente.IdCli = idClienteRegistrado
                        ClienteCom.IdCli = idClienteRegistrado
                        ClienteAdic.IdCli = idClienteRegistrado
                        If (CliComDAL.registraClienteCom(ClienteCom)) Then
                            If (CliAdicDAL.registraClienteAdic(ClienteAdic)) Then
                                boolTransaccComplete = True
                            End If
                        End If
                    End If
                    If (boolTransaccComplete) Then
                        transacCliente.Complete()
                        detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ProcesamientoOK, "El Cliente se registro con éxito.")
                        Return True
                    Else
                        detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.Catalogo_NoFueRegistrado,
                                                 "El Cliente no pudo ser registrado en el sistema." & vbCrLf & detResp.Mensajes)
                        Return False
                    End If
                End Using
            Else
                detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ValoresInvalidos,
                                         "El Cliente no es valido para registrar: " & vbCrLf & detResp.Mensajes)
                Return False
            End If
        Catch ex As Exception
            Log.LogException(ex, "ClientesBL.RegistrarCliente")
            detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ExcepcionEnOperacion,
                                     detResp.Mensajes & "Excepción al registrar el Cliente: " & ex.Message)
            Return False
        Finally
            CliDAL = Nothing
            CliComDAL = Nothing
            CliAdicDAL = Nothing
            idClienteRegistrado = Nothing
            boolTransaccComplete = Nothing
        End Try
    End Function

    Private Function EsValidoPara(ByVal operacion As Accion, ByRef Cliente As ClientesBE, ByRef ClienteCom As ClientesComBE, ByRef ClienteAdic As ClientesAdicBE, ByRef mensaje As String,
                                  ByVal token As String) As Boolean
        mensaje = ""
        Dim arrCorreos As String() = Nothing
        Try
            Select Case operacion
                Case Accion.Registrar
                    If (Cliente.IdCli <> 0) Then
                        mensaje &= "El Cliente contiene un Id que pertenece a un registro previo, imposible registrar." & vbCrLf
                    End If

                Case Accion.Actualizar
                    If (Cliente.IdCli <= 0) Then
                        mensaje &= "El Id del Cliente debe ser mayor a 0." & vbCrLf
                    End If
            End Select

            If (String.IsNullOrWhiteSpace(Cliente.RfcCli)) Then
                mensaje &= "El RFC del Cliente es obligatorio, no puede ir el campo vacio." & vbCrLf
            Else
                Cliente.RfcCli = Cliente.RfcCli.Trim.ToUpper

                Select Case Cliente.RfcCli.Length
                    Case 12
                        If (Not (csValidaciones.esRFCValidoPersonaMoral(Cliente.RfcCli))) Then
                            mensaje &= String.Format("RFC <{0}> no válido para Persona Moral", Cliente.RfcCli) & vbCrLf
                        End If

                    Case 13
                        If (Not (csValidaciones.esRFCValidoPersonaFisica(Cliente.RfcCli))) Then
                            mensaje &= String.Format("RFC <{0}> no válido para Persona Física", Cliente.RfcCli) & vbCrLf
                        End If

                    Case Else
                        mensaje &= String.Format("Longitud de RFC no válida (<{0}>)", Cliente.RfcCli) & vbCrLf
                End Select
            End If

            If (String.IsNullOrWhiteSpace(Cliente.RazonSocial)) Then
                mensaje &= "La Razon Social del Cliente es obligatoria." & vbCrLf
            Else
                Cliente.RazonSocial = Cliente.RazonSocial.Trim
                If (Cliente.RazonSocial.Length > 255) Then
                    Cliente.RazonSocial = Cliente.RazonSocial.Substring(0, 255)
                End If
            End If

            If Not (String.IsNullOrWhiteSpace(Cliente.Nombre)) Then
                Cliente.Nombre = Cliente.Nombre.Trim
                If (Cliente.Nombre.Length > 255) Then
                    Cliente.Nombre = Cliente.Nombre.Substring(0, 255)
                End If
            Else
                Cliente.Nombre = ""
            End If

            If Not (String.IsNullOrWhiteSpace(Cliente.Telefono)) Then
                Cliente.Telefono = Cliente.Telefono.Trim
                If (Cliente.Telefono.Length > 20) Then
                    Cliente.Telefono = Cliente.Telefono.Substring(0, 20)
                End If
            Else
                Cliente.Telefono = ""
            End If

            If Not (String.IsNullOrWhiteSpace(Cliente.Fax)) Then
                Cliente.Fax = Cliente.Fax.Trim
                If (Cliente.Fax.Length > 20) Then
                    Cliente.Fax = Cliente.Fax.Substring(0, 20)
                End If
            Else
                Cliente.Fax = ""
            End If

            If Not (String.IsNullOrWhiteSpace(Cliente.CorreoElect)) Then
                Cliente.CorreoElect = Cliente.CorreoElect.Trim
                If (Cliente.CorreoElect.Length > 500) Then
                    Cliente.CorreoElect = Cliente.CorreoElect.Substring(0, 500)
                End If
                arrCorreos = Cliente.CorreoElect.Split(";"c)
                For Each correo As String In arrCorreos
                    correo = correo.Trim()
                    If (Not (csValidaciones.esCorreoValido(correo))) Then
                        mensaje &= String.Format("Dirección de Correo Electrónico <{0}> no válido.{1}", correo, vbCrLf)
                    End If
                Next
            Else
                Cliente.CorreoElect = ""
            End If

            If Not (String.IsNullOrWhiteSpace(Cliente.Observaciones)) Then
                Cliente.Observaciones = Cliente.Observaciones.Trim
                If (Cliente.Observaciones.Length > 255) Then
                    Cliente.Observaciones = Cliente.Observaciones.Substring(0, 255)
                End If
            Else
                Cliente.Observaciones = ""
            End If

            If Not (String.IsNullOrWhiteSpace(Cliente.IdExt)) Then
                Cliente.IdExt = Cliente.IdExt.Trim
                If (Cliente.IdExt.Length > 30) Then
                    Cliente.IdExt = Cliente.IdExt.Substring(0, 30)
                End If
            Else
                Cliente.IdExt = ""
            End If

            If Not (String.IsNullOrWhiteSpace(Cliente.Calle)) Then
                Cliente.Calle = Cliente.Calle.Trim
                If (Cliente.Calle.Length > 150) Then
                    Cliente.Calle = Cliente.Calle.Trim.Substring(0, 150)
                End If
            Else
                Cliente.Calle = ""
            End If

            If Not (String.IsNullOrWhiteSpace(Cliente.NoExterior)) Then
                Cliente.NoExterior = Cliente.NoExterior.Trim
                If (Cliente.NoExterior.Length > 50) Then
                    Cliente.NoExterior = Cliente.NoExterior.Trim.Substring(0, 50)
                End If
            Else
                Cliente.NoExterior = ""
            End If

            If Not (String.IsNullOrWhiteSpace(Cliente.NoInterior)) Then
                Cliente.NoInterior = Cliente.NoInterior.Trim
                If (Cliente.NoInterior.Length > 50) Then
                    Cliente.NoInterior = Cliente.NoInterior.Trim.Substring(0, 50)
                End If
            Else
                Cliente.NoInterior = ""
            End If

            If Not (String.IsNullOrWhiteSpace(Cliente.Colonia)) Then
                Cliente.Colonia = Cliente.Colonia.Trim
                If (Cliente.Colonia.Length > 50) Then
                    Cliente.Colonia = Cliente.Colonia.Trim.Substring(0, 50)
                End If
            Else
                Cliente.Colonia = ""
            End If

            If Not (String.IsNullOrWhiteSpace(Cliente.Localidad)) Then
                Cliente.Localidad = Cliente.Localidad.Trim
                If (Cliente.Localidad.Length > 50) Then
                    Cliente.Localidad = Cliente.Localidad.Trim.Substring(0, 50)
                End If
            Else
                Cliente.Localidad = ""
            End If

            If Not (String.IsNullOrWhiteSpace(Cliente.Referencia)) Then
                Cliente.Referencia = Cliente.Referencia.Trim
                If (Cliente.Referencia.Length > 50) Then
                    Cliente.Referencia = Cliente.Referencia.Trim.Substring(0, 50)
                End If
            Else
                Cliente.Referencia = ""
            End If

            If Not (String.IsNullOrWhiteSpace(Cliente.Municipio)) Then
                Cliente.Municipio = Cliente.Municipio.Trim
                If (Cliente.Municipio.Length > 50) Then
                    Cliente.Municipio = Cliente.Municipio.Trim.Substring(0, 50)
                End If
            Else
                Cliente.Municipio = ""
            End If

            If Not (String.IsNullOrWhiteSpace(Cliente.Estado)) Then
                Cliente.Estado = Cliente.Estado.Trim
                If (Cliente.Estado.Length > 50) Then
                    Cliente.Estado = Cliente.Estado.Trim.Substring(0, 50)
                End If
            Else
                Cliente.Estado = ""
            End If

            If Not (String.IsNullOrWhiteSpace(Cliente.Pais)) Then
                Cliente.Pais = Cliente.Pais.Trim
                If (Cliente.Pais.Length > 50) Then
                    Cliente.Pais = Cliente.Pais.Trim.Substring(0, 50)
                End If
            Else
                Cliente.Pais = ""
            End If

            If Not (String.IsNullOrWhiteSpace(Cliente.CodigoPostal)) Then
                Cliente.CodigoPostal = Cliente.CodigoPostal.Trim
                'Para clientes extranjeros puede ser cualquier cadena, para clientes nacionales un codigo postal valido
                If (Not String.IsNullOrWhiteSpace(Cliente.RfcCli) AndAlso Cliente.RfcCli.ToUpper.Equals("XEXX010101000")) Then
                    If (Cliente.CodigoPostal.Length > 10) Then
                        Cliente.CodigoPostal = Cliente.CodigoPostal.Substring(0, 10)
                    End If
                Else
                    If (Not csValidaciones.esCodigoPostalValido(Cliente.CodigoPostal)) Then
                        mensaje &= String.Format("Código Postal <{0}> debe ser de 5 dígitos", Cliente.CodigoPostal) & vbCrLf
                    End If
                End If
            Else
                Cliente.CodigoPostal = ""
            End If

            'Validar requeridos y opcionales de acuerdo a anexo 20
            With Cliente
                If (Not String.IsNullOrWhiteSpace(.Calle) Or
                    Not String.IsNullOrWhiteSpace(.NoExterior) Or
                    Not String.IsNullOrWhiteSpace(.NoInterior) Or
                    Not String.IsNullOrWhiteSpace(.Colonia) Or
                    Not String.IsNullOrWhiteSpace(.Localidad) Or
                    Not String.IsNullOrWhiteSpace(.Referencia) Or
                    Not String.IsNullOrWhiteSpace(.Municipio) Or
                    Not String.IsNullOrWhiteSpace(.Estado) Or
                    Not String.IsNullOrWhiteSpace(.Pais) Or
                    Not String.IsNullOrWhiteSpace(.CodigoPostal)) Then
                    If (String.IsNullOrWhiteSpace(.Pais)) Then
                        mensaje &= "El País del Receptor es requerido." & vbCrLf
                    End If
                End If
            End With

            ''''''VALIDAR OBJETO DE DATOS COMERCIALES DEL CLIENTE
            Select Case operacion
                Case Accion.Registrar
                    If (ClienteCom Is Nothing) Then
                        ClienteCom = New ClientesComBE
                        With ClienteCom
                            .LimiteCredito = 0D
                            .Saldo = 0D
                            .DiasCredito = 0
                            .MetodoPago = Nothing
                            .Banco = ""
                            .CuentaBancaria = ""
                            .ClienteMayoreo = False
                            .ListPrecios = 1
                            .Descuento = 0D
                            .Clasificacion = ""
                            .Vendedor = Nothing
                            .CuentaContable = ""
                            '.SubCuenta = ""
                            .CuentaAnticipos = ""
                        End With
                    End If
                    Me.EsValidoParaRegistrarDatosComerciales(ClienteCom, mensaje, token)

                Case Accion.Actualizar
                    If (ClienteCom Is Nothing) Then
                        mensaje &= "Indicar los datos comerciales del Cliente." & vbCrLf
                    Else
                        If (ClienteCom.IdCli <> Cliente.IdCli) Then
                            mensaje &= "El Id de los datos comerciales del Cliente no corresponde al Cliente." & vbCrLf
                        Else
                            Me.EsValidoParaRegistrarDatosComerciales(ClienteCom, mensaje, token)
                        End If
                    End If
            End Select

            ''''''VALIDAR OBJETO DE DATOS ADICIONALES DEL CLIENTE
            Select Case operacion
                Case Accion.Registrar
                    If (ClienteAdic Is Nothing) Then
                        ClienteAdic = New ClientesAdicBE
                        With ClienteAdic
                            .campoLibre1 = ""
                            .campoLibre2 = ""
                            .campoLibre3 = ""
                            .campoLibre4 = ""
                            .campoLibre5 = ""
                            .campoLibre6 = ""
                            .campoLibre7 = ""
                            .campoLibre8 = ""
                            .Encabezado1 = ""
                            .Encabezado2 = ""
                            .Encabezado3 = ""
                            .Encabezado4 = ""
                            .Encabezado5 = ""
                            .Encabezado6 = ""
                            .Nombre1 = ""
                            .Nombre2 = ""
                            .Nombre3 = ""
                            .Nombre4 = ""
                            .Nombre5 = ""
                            .Nombre6 = ""
                            .Puesto1 = ""
                            .Puesto2 = ""
                            .Puesto3 = ""
                            .Puesto4 = ""
                            .Puesto5 = ""
                            .Puesto6 = ""
                        End With
                    End If
                    Me.EsValidoParaRegistrarDatosAdicionales(ClienteAdic, mensaje)

                Case Accion.Actualizar
                    If (ClienteAdic Is Nothing) Then
                        mensaje &= "Indicar los datos adicionales del Cliente." & vbCrLf
                    Else
                        If (ClienteAdic.IdCli <> Cliente.IdCli) Then
                            mensaje &= "El Id de los datos adicionales del Cliente no corresponde al Cliente." & vbCrLf
                        Else
                            Me.EsValidoParaRegistrarDatosAdicionales(ClienteAdic, mensaje)
                        End If
                    End If
            End Select

            Return (mensaje = "")
        Catch ex As Exception
            Log.LogException(ex, "ClientesBL.EsValidoParaRegistrar")
            mensaje &= ex.Message
            Return False
        End Try
    End Function

    Private Sub EsValidoParaRegistrarDatosAdicionales(ByRef ClienteAdic As ClientesAdicBE, ByRef mensaje As String)
        Try
            If Not (String.IsNullOrWhiteSpace(ClienteAdic.campoLibre1)) Then
                ClienteAdic.campoLibre1 = ClienteAdic.campoLibre1.Trim
                If (ClienteAdic.campoLibre1.Length > 100) Then
                    ClienteAdic.campoLibre1 = ClienteAdic.campoLibre1.Substring(0, 100)
                End If
            Else
                ClienteAdic.campoLibre1 = ""
            End If

            If Not (String.IsNullOrWhiteSpace(ClienteAdic.campoLibre2)) Then
                ClienteAdic.campoLibre2 = ClienteAdic.campoLibre2.Trim
                If (ClienteAdic.campoLibre2.Length > 100) Then
                    ClienteAdic.campoLibre2 = ClienteAdic.campoLibre2.Substring(0, 100)
                End If
            Else
                ClienteAdic.campoLibre2 = ""
            End If

            If Not (String.IsNullOrWhiteSpace(ClienteAdic.campoLibre3)) Then
                ClienteAdic.campoLibre3 = ClienteAdic.campoLibre3.Trim
                If (ClienteAdic.campoLibre3.Length > 100) Then
                    ClienteAdic.campoLibre3 = ClienteAdic.campoLibre3.Substring(0, 100)
                End If
            Else
                ClienteAdic.campoLibre3 = ""
            End If

            If Not (String.IsNullOrWhiteSpace(ClienteAdic.campoLibre4)) Then
                ClienteAdic.campoLibre4 = ClienteAdic.campoLibre4.Trim
                If (ClienteAdic.campoLibre4.Length > 100) Then
                    ClienteAdic.campoLibre4 = ClienteAdic.campoLibre4.Substring(0, 100)
                End If
            Else
                ClienteAdic.campoLibre4 = ""
            End If

            If Not (String.IsNullOrWhiteSpace(ClienteAdic.campoLibre5)) Then
                ClienteAdic.campoLibre5 = ClienteAdic.campoLibre5.Trim
                If (ClienteAdic.campoLibre5.Length > 100) Then
                    ClienteAdic.campoLibre5 = ClienteAdic.campoLibre5.Substring(0, 100)
                End If
            Else
                ClienteAdic.campoLibre5 = ""
            End If

            If Not (String.IsNullOrWhiteSpace(ClienteAdic.campoLibre6)) Then
                ClienteAdic.campoLibre6 = ClienteAdic.campoLibre6.Trim
                If (ClienteAdic.campoLibre6.Length > 100) Then
                    ClienteAdic.campoLibre6 = ClienteAdic.campoLibre6.Substring(0, 100)
                End If
            Else
                ClienteAdic.campoLibre6 = ""
            End If

            If Not (String.IsNullOrWhiteSpace(ClienteAdic.campoLibre7)) Then
                ClienteAdic.campoLibre7 = ClienteAdic.campoLibre7.Trim
                If (ClienteAdic.campoLibre7.Length > 100) Then
                    ClienteAdic.campoLibre7 = ClienteAdic.campoLibre7.Substring(0, 100)
                End If
            Else
                ClienteAdic.campoLibre7 = ""
            End If

            If Not (String.IsNullOrWhiteSpace(ClienteAdic.campoLibre8)) Then
                ClienteAdic.campoLibre8 = ClienteAdic.campoLibre8.Trim
                If (ClienteAdic.campoLibre8.Length > 100) Then
                    ClienteAdic.campoLibre8 = ClienteAdic.campoLibre8.Substring(0, 100)
                End If
            Else
                ClienteAdic.campoLibre8 = ""
            End If

            If Not (String.IsNullOrWhiteSpace(ClienteAdic.Encabezado1)) Then
                ClienteAdic.Encabezado1 = ClienteAdic.Encabezado1.Trim
                If (ClienteAdic.Encabezado1.Length > 20) Then
                    ClienteAdic.Encabezado1 = ClienteAdic.Encabezado1.Substring(0, 20)
                End If
            Else
                ClienteAdic.Encabezado1 = ""
            End If

            If Not (String.IsNullOrWhiteSpace(ClienteAdic.Encabezado2)) Then
                ClienteAdic.Encabezado2 = ClienteAdic.Encabezado2.Trim
                If (ClienteAdic.Encabezado2.Length > 20) Then
                    ClienteAdic.Encabezado2 = ClienteAdic.Encabezado2.Substring(0, 20)
                End If
            Else
                ClienteAdic.Encabezado2 = ""
            End If

            If Not (String.IsNullOrWhiteSpace(ClienteAdic.Encabezado3)) Then
                ClienteAdic.Encabezado3 = ClienteAdic.Encabezado3.Trim
                If (ClienteAdic.Encabezado3.Length > 20) Then
                    ClienteAdic.Encabezado3 = ClienteAdic.Encabezado3.Substring(0, 20)
                End If
            Else
                ClienteAdic.Encabezado3 = ""
            End If

            If Not (String.IsNullOrWhiteSpace(ClienteAdic.Encabezado4)) Then
                ClienteAdic.Encabezado4 = ClienteAdic.Encabezado4.Trim
                If (ClienteAdic.Encabezado4.Length > 20) Then
                    ClienteAdic.Encabezado4 = ClienteAdic.Encabezado4.Substring(0, 20)
                End If
            Else
                ClienteAdic.Encabezado4 = ""
            End If

            If Not (String.IsNullOrWhiteSpace(ClienteAdic.Encabezado5)) Then
                ClienteAdic.Encabezado5 = ClienteAdic.Encabezado5.Trim
                If (ClienteAdic.Encabezado5.Length > 20) Then
                    ClienteAdic.Encabezado5 = ClienteAdic.Encabezado5.Substring(0, 20)
                End If
            Else
                ClienteAdic.Encabezado5 = ""
            End If

            If Not (String.IsNullOrWhiteSpace(ClienteAdic.Encabezado6)) Then
                ClienteAdic.Encabezado6 = ClienteAdic.Encabezado6.Trim
                If (ClienteAdic.Encabezado6.Length > 20) Then
                    ClienteAdic.Encabezado6 = ClienteAdic.Encabezado6.Substring(0, 20)
                End If
            Else
                ClienteAdic.Encabezado6 = ""
            End If

            If Not (String.IsNullOrWhiteSpace(ClienteAdic.Nombre1)) Then
                ClienteAdic.Nombre1 = ClienteAdic.Nombre1.Trim
                If (ClienteAdic.Nombre1.Length > 100) Then
                    ClienteAdic.Nombre1 = ClienteAdic.Nombre1.Substring(0, 100)
                End If
            Else
                ClienteAdic.Nombre1 = ""
            End If

            If Not (String.IsNullOrWhiteSpace(ClienteAdic.Nombre2)) Then
                ClienteAdic.Nombre2 = ClienteAdic.Nombre2.Trim
                If (ClienteAdic.Nombre2.Length > 100) Then
                    ClienteAdic.Nombre2 = ClienteAdic.Nombre2.Substring(0, 100)
                End If
            Else
                ClienteAdic.Nombre2 = ""
            End If

            If Not (String.IsNullOrWhiteSpace(ClienteAdic.Nombre3)) Then
                ClienteAdic.Nombre3 = ClienteAdic.Nombre3.Trim
                If (ClienteAdic.Nombre3.Length > 100) Then
                    ClienteAdic.Nombre3 = ClienteAdic.Nombre3.Substring(0, 100)
                End If
            Else
                ClienteAdic.Nombre3 = ""
            End If

            If Not (String.IsNullOrWhiteSpace(ClienteAdic.Nombre4)) Then
                ClienteAdic.Nombre4 = ClienteAdic.Nombre4.Trim
                If (ClienteAdic.Nombre4.Length > 100) Then
                    ClienteAdic.Nombre4 = ClienteAdic.Nombre4.Substring(0, 100)
                End If
            Else
                ClienteAdic.Nombre4 = ""
            End If

            If Not (String.IsNullOrWhiteSpace(ClienteAdic.Nombre5)) Then
                ClienteAdic.Nombre5 = ClienteAdic.Nombre5.Trim
                If (ClienteAdic.Nombre5.Length > 100) Then
                    ClienteAdic.Nombre5 = ClienteAdic.Nombre5.Substring(0, 100)
                End If
            Else
                ClienteAdic.Nombre5 = ""
            End If

            If Not (String.IsNullOrWhiteSpace(ClienteAdic.Nombre6)) Then
                ClienteAdic.Nombre6 = ClienteAdic.Nombre6.Trim
                If (ClienteAdic.Nombre6.Length > 100) Then
                    ClienteAdic.Nombre6 = ClienteAdic.Nombre6.Substring(0, 100)
                End If
            Else
                ClienteAdic.Nombre6 = ""
            End If

            If Not (String.IsNullOrWhiteSpace(ClienteAdic.Puesto1)) Then
                ClienteAdic.Puesto1 = ClienteAdic.Puesto1.Trim
                If (ClienteAdic.Puesto1.Length > 100) Then
                    ClienteAdic.Puesto1 = ClienteAdic.Puesto1.Substring(0, 100)
                End If
            Else
                ClienteAdic.Puesto1 = ""
            End If

            If Not (String.IsNullOrWhiteSpace(ClienteAdic.Puesto2)) Then
                ClienteAdic.Puesto2 = ClienteAdic.Puesto2.Trim
                If (ClienteAdic.Puesto2.Length > 100) Then
                    ClienteAdic.Puesto2 = ClienteAdic.Puesto2.Substring(0, 100)
                End If
            Else
                ClienteAdic.Puesto2 = ""
            End If

            If Not (String.IsNullOrWhiteSpace(ClienteAdic.Puesto3)) Then
                ClienteAdic.Puesto3 = ClienteAdic.Puesto3.Trim
                If (ClienteAdic.Puesto3.Length > 100) Then
                    ClienteAdic.Puesto3 = ClienteAdic.Puesto3.Substring(0, 100)
                End If
            Else
                ClienteAdic.Puesto3 = ""
            End If

            If Not (String.IsNullOrWhiteSpace(ClienteAdic.Puesto4)) Then
                ClienteAdic.Puesto4 = ClienteAdic.Puesto4.Trim
                If (ClienteAdic.Puesto4.Length > 100) Then
                    ClienteAdic.Puesto4 = ClienteAdic.Puesto4.Substring(0, 100)
                End If
            Else
                ClienteAdic.Puesto4 = ""
            End If

            If Not (String.IsNullOrWhiteSpace(ClienteAdic.Puesto5)) Then
                ClienteAdic.Puesto5 = ClienteAdic.Puesto5.Trim
                If (ClienteAdic.Puesto5.Length > 100) Then
                    ClienteAdic.Puesto5 = ClienteAdic.Puesto5.Substring(0, 100)
                End If
            Else
                ClienteAdic.Puesto5 = ""
            End If

            If Not (String.IsNullOrWhiteSpace(ClienteAdic.Puesto6)) Then
                ClienteAdic.Puesto6 = ClienteAdic.Puesto6.Trim
                If (ClienteAdic.Puesto6.Length > 100) Then
                    ClienteAdic.Puesto6 = ClienteAdic.Puesto6.Substring(0, 100)
                End If
            Else
                ClienteAdic.Puesto6 = ""
            End If

        Catch ex As Exception
            Log.LogException(ex, "ClientesComBL.EsValidoParaRegistrar")
            mensaje &= ex.Message
        End Try
    End Sub

    Private Sub EsValidoParaRegistrarDatosComerciales(ByRef ClienteCom As ClientesComBE, ByRef mensaje As String, ByVal token As String)
        Dim metPagBL As MetodospagBL = New MetodospagBL()
        Dim detResp As DetalleRespuesta = New DetalleRespuesta()
        Dim vendBL As VendedoresBL = New VendedoresBL()
        Dim cteDAL As ClientesDAL = New ClientesDAL("")
        Try
            If Not (String.IsNullOrWhiteSpace(ClienteCom.LimiteCredito)) Then
                If Not (IsNumeric(ClienteCom.LimiteCredito)) Then
                    mensaje &= "EL Limite de Credito del Cliente debe ser de tipo numérico." & vbCrLf
                Else
                    If (ClienteCom.LimiteCredito < 0) Then
                        mensaje &= "El Límite de Crédito del Cliente no puede ser un número negativo." & vbCrLf
                    End If
                End If
            Else
                ClienteCom.LimiteCredito = 0D
            End If

            If Not (String.IsNullOrWhiteSpace(ClienteCom.Saldo)) Then
                If Not (IsNumeric(ClienteCom.Saldo)) Then
                    mensaje &= "EL Saldo del Cliente debe ser de tipo numérico." & vbCrLf
                Else
                    'EL SALDO DEL CLIENTE SÍ PUEDE SER NEGATIVO
                    'If (ClienteCom.Saldo < 0) Then
                    '    mensaje &= "El Saldo del Cliente no puede ser un número negativo." & vbCrLf
                    'End If
                End If
            Else
                ClienteCom.Saldo = 0D
            End If

            If Not (String.IsNullOrWhiteSpace(ClienteCom.DiasCredito)) Then
                If Not (IsNumeric(ClienteCom.DiasCredito)) Then
                    mensaje &= "Los Dias de Credito debe ser de tipo numérico." & vbCrLf
                Else
                    If (ClienteCom.DiasCredito < 0) Then
                        mensaje &= "Los Días de Crédito no pueden ser menores a 0." & vbCrLf
                    End If
                End If
            Else
                ClienteCom.DiasCredito = 0
            End If

            If (ClienteCom.MetodoPago IsNot Nothing) Then
                If (ClienteCom.MetodoPago.IdMetodP <= 0) Then
                    mensaje &= "El Método de Pago del Cliente es requerido." & vbCrLf
                Else
                    'Validar que el Id exista
                    If (metPagBL.GetMetodopag(token, ClienteCom.MetodoPago.IdMetodP, detResp) Is Nothing) Then
                        mensaje &= "El Método de Pago <" & ClienteCom.MetodoPago.IdMetodP.ToString() & "> no está registrado en el Sistema, favor de verificar." & vbCrLf
                    End If
                End If
            End If

            If Not (String.IsNullOrWhiteSpace(ClienteCom.Banco)) Then
                ClienteCom.Banco = ClienteCom.Banco.Trim
                If (ClienteCom.Banco.Length > 50) Then
                    ClienteCom.Banco = ClienteCom.Banco.Substring(0, 50)
                End If
            Else
                ClienteCom.Banco = ""
            End If

            If Not (String.IsNullOrWhiteSpace(ClienteCom.CuentaBancaria)) Then
                ClienteCom.CuentaBancaria = ClienteCom.CuentaBancaria.Trim
                If (ClienteCom.CuentaBancaria.Length < 4) Then
                    mensaje &= "La Cuenta Bancaria del cliente debe contener al menos 4 caracteres." & vbCrLf
                ElseIf (ClienteCom.CuentaBancaria.Length > 30) Then
                    ClienteCom.CuentaBancaria = ClienteCom.CuentaBancaria.Substring(0, 30)
                End If
            Else
                ClienteCom.CuentaBancaria = ""
            End If

            If (ClienteCom.ListPrecios < 0) Then
                mensaje &= "La Lista de Precios del Cliente es requerida." & vbCrLf
            End If

            If Not (String.IsNullOrWhiteSpace(ClienteCom.Descuento)) Then
                If Not (IsNumeric(ClienteCom.Descuento)) Then
                    mensaje &= "El Porcentaje de Descuento del Cliente debe ser de tipo numérico." & vbCrLf
                ElseIf (ClienteCom.Descuento < 0) Then
                    mensaje &= "El Porcentaje de Descuento del Cliente no puede ser un valor menor a 0." & vbCrLf
                End If
            Else
                ClienteCom.Descuento = 0D
            End If

            If (Not String.IsNullOrWhiteSpace(ClienteCom.Clasificacion)) Then
                ClienteCom.Clasificacion = ClienteCom.Clasificacion.Trim
                If (ClienteCom.Clasificacion.Length > 50) Then
                    ClienteCom.Clasificacion = ClienteCom.Clasificacion.Substring(0, 50)
                End If
                'Validar que la Clasificación exista
                cteDAL = New ClientesDAL(RijndaelSimple.desencriptaDefault(token))
                If Not (cteDAL.existeClasificacionCliente(ClienteCom.Clasificacion)) Then
                    mensaje &= "La Clasificación del Cliente no está registrada en el sistema, favor de verificar." & vbCrLf
                End If
            Else
                ClienteCom.Clasificacion = ""
            End If

            If (ClienteCom.Vendedor IsNot Nothing) Then
                If (ClienteCom.Vendedor.IdVendedor <= 0) Then
                    mensaje &= "El Vendedor asignado al Cliente debe estar registrado en el Sistema." & vbCrLf
                Else
                    'Validar que el Id exista
                    If (vendBL.GetVendedorById(token, ClienteCom.Vendedor.IdVendedor, detResp) Is Nothing) Then
                        mensaje &= "El Vendedor <" & ClienteCom.Vendedor.IdVendedor & "> no está registrado en el sistema, favor de verificar." & vbCrLf
                    End If
                End If
            End If

            If Not (String.IsNullOrWhiteSpace(ClienteCom.CuentaContable)) Then
                ClienteCom.CuentaContable = ClienteCom.CuentaContable.Trim
                If (ClienteCom.CuentaContable.Length > 30) Then
                    ClienteCom.CuentaContable = ClienteCom.CuentaContable.Substring(0, 30)
                End If
                If (Not csValidaciones.tieneSoloDigitosYGuiones(ClienteCom.CuentaContable)) Then
                    mensaje &= "La Cuenta Contable del Cliente solo puede contener números o el caracter '-'." & vbCrLf
                End If
            Else
                ClienteCom.CuentaContable = ""
            End If

            'If Not (String.IsNullOrWhiteSpace(ClienteCom.SubCuenta)) Then
            '    ClienteCom.SubCuenta = ClienteCom.SubCuenta.Trim
            '    If (ClienteCom.SubCuenta.Length > 30) Then
            '        ClienteCom.SubCuenta = ClienteCom.SubCuenta.Substring(0, 30)
            '    End If
            '    If (Not csValidaciones.tieneSoloDigitosYGuiones(ClienteCom.SubCuenta)) Then
            '        mensaje &= "La SubCuenta Contable del Cliente solo puede contener números o el caracter '-'." & vbCrLf
            '    End If
            'Else
            '    ClienteCom.SubCuenta = ""
            'End If

            If Not (String.IsNullOrWhiteSpace(ClienteCom.CuentaAnticipos)) Then
                ClienteCom.CuentaAnticipos = ClienteCom.CuentaAnticipos.Trim
                If (ClienteCom.CuentaAnticipos.Length > 30) Then
                    ClienteCom.CuentaAnticipos = ClienteCom.CuentaAnticipos.Substring(0, 30)
                End If
                If (Not csValidaciones.tieneSoloDigitosYGuiones(ClienteCom.CuentaAnticipos)) Then
                    mensaje &= "La Cuenta de Anticipos del cliente solo puede contener números o el caracter '-'." & vbCrLf
                End If
            Else
                ClienteCom.CuentaAnticipos = ""
            End If

        Catch ex As Exception
            Log.LogException(ex, "ClientesComBL.EsValidoParaRegistrarDatosComerciales")
            mensaje &= ex.Message
        End Try
    End Sub

    Public Function ActualizaCliente(ByVal TokenConexion As String, ByVal Cliente As ClientesBE, ByVal ClienteCom As ClientesComBE,
                                     ByVal ClienteAdic As ClientesAdicBE, ByRef detResp As DetalleRespuesta) As Boolean
        detResp.Mensajes = ""
        Dim CliDAL As ClientesDAL = New ClientesDAL("")
        Dim CliComDAL As ClientesComDAL = New ClientesComDAL("")
        Dim CliAdicDAL As ClientesAdicDAL = New ClientesAdicDAL("")
        Dim boolTransaccComplete As Boolean = False
        Try
            If (EsValidoPara(Accion.Actualizar, Cliente, ClienteCom, ClienteAdic, detResp.Mensajes, TokenConexion)) Then
                CliDAL = New ClientesDAL(RijndaelSimple.desencriptaDefault(TokenConexion))
                CliComDAL = New ClientesComDAL(RijndaelSimple.desencriptaDefault(TokenConexion))
                CliAdicDAL = New ClientesAdicDAL(RijndaelSimple.desencriptaDefault(TokenConexion))
                Using transacCliente As TransactionScope = New TransactionScope()
                    If (CliDAL.actualizaCliente(Cliente)) Then
                        If (CliComDAL.actualizaClienteCom(ClienteCom)) Then
                            If (CliAdicDAL.actualizaClienteAdic(ClienteAdic)) Then
                                boolTransaccComplete = True
                            End If
                        End If
                    End If
                    If (boolTransaccComplete) Then
                        transacCliente.Complete()
                        detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ProcesamientoOK, "Datos del Cliente actualizados.")
                        Return True
                    Else
                        detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.Catalogo_NoFueActualizado,
                                                 "No se pudo realizar la actualización de Datos del Cliente." & vbCrLf &
                                                 "Verifique que el Id del Cliente sea correcto y el RFC esté previamente registrado." & vbCrLf & detResp.Mensajes)
                        Return False
                    End If
                End Using
            Else
                detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ValoresInvalidos,
                                     "La informacion no es valida para actualizar: " & vbCrLf & detResp.Mensajes)
                Return False
            End If
        Catch ex As Exception
            Log.LogException(ex, "ClientesBL.ActualizaCliente")
            detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ExcepcionEnOperacion,
                                     detResp.Mensajes & "Excepción al actualizar Cliente: " & ex.Message)
            Return False
        Finally
            CliDAL = Nothing
            CliComDAL = Nothing
            CliAdicDAL = Nothing
            boolTransaccComplete = Nothing
        End Try
    End Function

    Public Function GetCliente(ByVal tokenConexion As String, ByVal IdCli As Integer, ByVal RfcCli As String,
                               ByRef clienteCom As ClientesComBE, ByRef clienteAdic As ClientesAdicBE,
                               ByRef detResp As DetalleRespuesta) As ClientesBE
        detResp.Mensajes = ""
        Dim CliDAL As ClientesDAL = New ClientesDAL("")
        Dim CliComDAL As ClientesComDAL = New ClientesComDAL("")
        Dim CliAdicDAL As ClientesAdicDAL = New ClientesAdicDAL("")
        Dim CliBE As ClientesBE
        clienteCom = Nothing
        clienteAdic = Nothing
        Dim boolClienteRecuperado As Boolean = False
        Try
            tokenConexion = RijndaelSimple.desencriptaDefault(tokenConexion)
            If (EsValidoParaGetCliente(IdCli, RfcCli, detResp.Mensajes)) Then
                CliDAL = New ClientesDAL(tokenConexion)
                CliComDAL = New ClientesComDAL(tokenConexion)
                CliAdicDAL = New ClientesAdicDAL(tokenConexion)
                CliBE = CliDAL.getCliente(IdCli, RfcCli)
                If (CliBE IsNot Nothing) Then
                    clienteCom = CliComDAL.getClienteCom(IdCli)
                    If (clienteCom IsNot Nothing) Then
                        clienteAdic = CliAdicDAL.getClienteAdic(IdCli)
                        If (clienteAdic IsNot Nothing) Then
                            boolClienteRecuperado = True
                        Else
                            detResp.Mensajes &= String.Format("No se obtuvo la Información adicional del cliente <{0}>{1}", IdCli, vbCrLf)
                            clienteCom = Nothing
                        End If
                    Else
                        detResp.Mensajes &= String.Format("No se obtuvo la Información comercial del cliente <{0}>{1}", IdCli, vbCrLf)
                    End If

                    If (boolClienteRecuperado) Then
                        detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ProcesamientoOK, "Se obtuvo la información del Cliente con éxito.")
                        Return CliBE
                    Else
                        detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.Catalogo_RegistroInexistenteOInactivo,
                                                 "No se obtuvo la información del Cliente" & vbCrLf &
                                                 "Verifique que el Cliente <" & RfcCli & "> con Id <" & IdCli.ToString() & "> esté registrado en el sistema." & vbCrLf & detResp.Mensajes)
                        Return Nothing
                    End If
                Else
                    detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.Catalogo_RegistroInexistenteOInactivo,
                                             "No se obtuvo la información del Cliente" & vbCrLf &
                                             "Verifique que el Cliente <" & RfcCli & "> con Id <" & IdCli.ToString() & "> esté registrado en el sistema." & vbCrLf & detResp.Mensajes)
                    Return Nothing
                End If
            Else
                detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ValoresInvalidos,
                                         "El Id del Cliente proporcionado no existe: " & vbCrLf & detResp.Mensajes)
                Return Nothing
            End If
        Catch ex As Exception
            Log.LogException(ex, "ClientesBL.GetCliente")
            detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ExcepcionEnOperacion,
                                     detResp.Mensajes & "Excepción al obtener información del Cliente: " & ex.Message)
            Return Nothing
        Finally
            CliDAL = Nothing
            CliBE = Nothing
            CliComDAL = Nothing
            CliAdicDAL = Nothing
            boolClienteRecuperado = Nothing
        End Try
    End Function

    Private Function EsValidoParaGetCliente(ByRef IdCli As Integer, ByRef rfcCli As String, ByRef mensaje As String) As Boolean
        mensaje = ""
        Try
            If (String.IsNullOrEmpty(IdCli)) Then
                mensaje &= "El campo ID del Cliente no puede ir vacio." & vbCrLf
            Else
                If (IdCli <= 0) Then
                    mensaje &= "El Id de la Cliente debe ser mayor a 0" & vbCrLf
                End If
            End If

            If (String.IsNullOrWhiteSpace(rfcCli)) Then
                mensaje &= "El RFC del Cliente es obligatorio, no puede ir el campo vacio." & vbCrLf
            Else
                rfcCli = rfcCli.Trim.ToUpper

                Select Case rfcCli.Length
                    Case 12
                        If (Not (csValidaciones.esRFCValidoPersonaMoral(rfcCli))) Then
                            mensaje &= String.Format("RFC <{0}> no válido para Persona Moral", rfcCli) & vbCrLf
                        End If

                    Case 13
                        If (Not (csValidaciones.esRFCValidoPersonaFisica(rfcCli))) Then
                            mensaje &= String.Format("RFC <{0}> no válido para Persona Física", rfcCli) & vbCrLf
                        End If

                    Case Else
                        mensaje &= String.Format("Longitud de RFC no válida (<{0}>)", rfcCli) & vbCrLf
                End Select
            End If

            Return (mensaje = "")
        Catch ex As Exception
            Log.LogException(ex, "ClientesBL.EsValidoParaGetCliente")
            mensaje &= ex.Message
            Return False
        End Try
    End Function

    Public Function GetListadoCliente(ByVal tokenConexion As String, ByVal RfcCli As String, ByVal CorreoElect As String, ByVal RazonSocial As String,
                                      ByVal pStatus As Enumeraciones.estatusParaBusquedas, ByVal pTipoPersona As Enumeraciones.tipoPersonas,
                                      ByVal pTipoContrib As Enumeraciones.tipoContribuyente,
                                      ByVal pRegistroInicial As Integer, ByVal pPageSize As Integer,
                                      ByVal pSortColumn As Enumeraciones.campoOrdenamiento, ByVal pSortDirection As Enumeraciones.tipoOrdenamiento,
                                      ByRef pTotalRegistros As Integer,
                                      ByRef detResp As DetalleRespuesta) As List(Of ClientesBE)
        detResp.Mensajes = ""
        pTotalRegistros = 0
        Dim CliDAL As ClientesDAL = New ClientesDAL("")
        Dim LCliBE As List(Of ClientesBE)
        Try
            tokenConexion = RijndaelSimple.desencriptaDefault(tokenConexion)
            CliDAL = New ClientesDAL(tokenConexion)
            LCliBE = CliDAL.getListadoCliente(RfcCli, CorreoElect, RazonSocial, pStatus, pTipoPersona, pTipoContrib,
                                              pRegistroInicial, pPageSize, pSortColumn, pSortDirection, pTotalRegistros)
            If (LCliBE IsNot Nothing) Then
                detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ProcesamientoOK, "Se obtuvo el listado de Clientes con éxito.")
                Return LCliBE
            Else
                detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.Catalogo_NoObtuvoRegistrosParaListado,
                                         "No se obtuvo el listado de Clientes" & vbCrLf & detResp.Mensajes)
                Return Nothing
            End If
        Catch ex As Exception
            Log.LogException(ex, "ClientesBL.GetListadoCliente")
            detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ExcepcionEnOperacion,
                                     detResp.Mensajes & "Excepción al obtener el listado de Clientes: " & ex.Message)
            Return Nothing
        Finally
            CliDAL = Nothing
            LCliBE = Nothing
        End Try
    End Function

    Public Function CambiaEstatus(ByVal tokenConexion As String, ByVal pId As Integer, ByVal pRfc As String,
        ByVal setActivo As Boolean, ByVal detResp As DetalleRespuesta) As Boolean
        detResp.Mensajes = ""
        Dim CliDAL As ClientesDAL = New ClientesDAL("")
        Try
            If (EsValidoParaGetCliente(pId, pRfc, detResp.Mensajes)) Then
                CliDAL = New ClientesDAL(RijndaelSimple.desencriptaDefault(tokenConexion))
                If (CliDAL.cambiaStatus(pId, pRfc, setActivo)) Then
                    detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ProcesamientoOK,
                                             "Estatus del Cliente Actualizado.")
                    Return True
                Else
                    detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.Catalogo_NoFueActualizado,
                                             "No se pudo realizar la actualización de estatus del Cliente." & vbCrLf &
                                             "Verifique que el Id y RFC del Cliente esten registrados en el sistema." & vbCrLf & detResp.Mensajes)
                    Return False
                End If
            Else
                detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ValoresInvalidos,
                                         "La informacion no es valida para actualizar: " & vbCrLf & detResp.Mensajes)
                Return False
            End If
        Catch ex As Exception
            Log.LogException(ex, "ClientesBL.CambiaEstatus")
            detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ExcepcionEnOperacion,
                                     detResp.Mensajes & "Excepción al actualizar estatus del Cliente: " & ex.Message)
            Return False
        Finally
            CliDAL = Nothing
        End Try
    End Function

    Function getListadoClasificacionesCliente(ByVal tokenConexion As String, ByRef detResp As DetalleRespuesta) As List(Of String)
        detResp.Mensajes = ""
        Dim cliDAL As ClientesDAL = New ClientesDAL("")
        Dim lsClasif As List(Of String)
        Try
            cliDAL = New ClientesDAL(RijndaelSimple.desencriptaDefault(tokenConexion))
            lsClasif = cliDAL.getListadoClasificacionCliente()
            If (lsClasif IsNot Nothing) Then
                detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ProcesamientoOK, "Se obtuvo el listado de Clasificación de Clientes con éxito.")
                Return lsClasif
            Else
                detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.Catalogo_NoObtuvoRegistrosParaListado,
                                         "No se obtuvo el listado de Clasificación de Clientes" & vbCrLf & detResp.Mensajes)
                Return Nothing
            End If
        Catch ex As Exception
            Log.LogException(ex, "ClientesBL.getListadoClasificacionesCliente")
            detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ExcepcionEnOperacion,
                                     detResp.Mensajes & "Excepción al obtener el listado de Clasificación de Clientes: " & ex.Message)
            Return Nothing
        Finally
            cliDAL = Nothing
            lsClasif = Nothing
        End Try
    End Function

End Class
